﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpModelInterface.h"
#include "IElement.h"
#include "OwnerPtr.h"
#include "Coordinate3d.h"
#include "IPolyCurve.h"
#include "ElementCreationOptions.h"
#include "IVisibilityTypeFlags.h"

namespace gcmp
{
    class ICurve2d;
    class ICurve3d;
    /// \brief 二维线的接口。二维线都是关联到一个平面的。
    class GCMP_MODEL_INTERFACE_EXPORT IDrawingLine : public IElement
    {
        DEFINE_CAST_DERIVED(gcmp::IDrawingLine, gcmp::IElement);
    public:
        /// \brief 析构函数。
        virtual ~IDrawingLine();
#pragma region Static
        /// \brief 获取所有二维线。
        /// 获取所有二维线的指针。
        /// \param pDoc 文档指针。
        /// \return 返回二维线的接口指针数组。
        static std::vector<IDrawingLine*> GetAllDrawingLines(const IDocument* pDoc, const UniIdentity& categoryUid);

        /// \brief 获取所有二维线Id。
        /// 获取取所有二维线的Id。
        /// \param pDoc 文档指针。
        /// \return 返回二维线的ElmentId数组。
        static std::vector<ElementId> GetAllDrawingLineIds(const IDocument* pDoc, const UniIdentity& categoryUid);

        /// \brief 创建有关联平面的直线二维线。
        /// \param pDoc 文档指针。
        /// \param planeId 二维线的关联平面。
        /// \param opCurve 二维线的几何数据。
        /// \param categoryUid 二维线类别。
        /// \return 返回一个二维线的接口指针。
        static IDrawingLine* Create(
            IDocument* pDoc,
            const ElementId& planeId,
            OwnerPtr<ICurve2d> opCurve,
            const UniIdentity& categoryUid,
            ElementId ownerModelViewId = ElementId::InvalidID);

#pragma endregion Static
        /// \brief 获取二维线的PolyCurve数据。
        /// \return 返回二维线的PolyCurve数据的指针。
        virtual OwnerPtr<IPolyCurve> GetPolyCurve() const = 0;

        /// \brief 设置二维线的PolyCurve数据。
        /// \param upPlane 新的PolyCurve数据。
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetPolyCurve(OwnerPtr<IPolyCurve> upCurve) = 0;

        /// \brief 获取二维线的几何数据。
        /// \return 返回二维线的几何数据的指针。
        virtual OwnerPtr<ICurve3d> GetGeometryCurve() const = 0;

        /// \brief 设置二维线的几何数据。
        /// \param upPlane 新的几何数据。
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetGeometryCurve(OwnerPtr<ICurve3d> upCurve) = 0;

        /// \brief 获取二维线的关联平面的坐标系。
        /// \return 返回二维线的的关联平面的坐标系。
        virtual Coordinate3d GetBasePlaneCoordinate() const = 0;

        /// \brief 获取二维线的样式Id。
        /// \return 返回二维线的样式的Id。
        virtual ElementId GetGraphicsStyleId() const = 0;

        /// \brief 设置二维线的样式。
        /// \param id 新的GraphicsCurve。
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetGraphicsStyleId(const ElementId& id) = 0;

        /// \brief 获取二维线是否为直线。
        /// \return 如果二维线是直线，返回true；否则返回false。
        virtual bool IsStraightLine() const = 0;

        /// \brief 获取二维线是否为圆弧。
        /// \return 如果二维线是圆弧，返回true；否则返回false。
        virtual bool IsArc() const = 0;

        /// \brief 获取二维线是否为椭圆弧。
        /// \return 如果二维线是椭圆弧，返回true；否则返回false。
        virtual bool IsEllipse() const = 0;

        /// \brief 获取二维线是否为多段线。
        /// \return 如果二维线是多段线，返回true；否则返回false。
        virtual bool IsPolyline() const = 0;

        /// \brief 获取二维线在内嵌到一个族中后，载入到项目是否可见。
        /// \return 如果二维线在内嵌到一个族中后可见，返回true；否则返回false。
        virtual bool IsVisibleWhenEmbededInFamily() const = 0;

        /// \brief 设置二维线在内嵌到一个族中后，载入到项目是否可见。
        /// \param bIsVisiableInParentDocument 是否可见。
        /// \return 如果设置成功返回true；否则返回false。
        virtual void SetIsVisibleWhenEmbededInFamily(bool bIsVisiableInParentDocument) = 0;



        /// \brief 获取可见性标记的非const指针,用户可通过操作此返回值对可见性进行修改
        ///
        /// \return 返回可见性标记的非const指针
        virtual IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() = 0;

        /// \brief 获取可见性标记的const指针
        ///
        /// \return 返回可见性标记的const指针
        virtual const IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() const = 0;

        /// \brief 获取二维线是否只在创建它的ModelView中可见。
        /// 
        /// 默认是不仅仅在创建它的视图中可见，例如平行视图中也可见（满足构件编辑器中的场景）。
        /// \return 如果二维线只在创建它的ModelView中可见，返回true；否则返回false。
        virtual bool IsVisibleOnlyInOwnerModelView() const = 0;

        /// \brief 设置二维线是否只在创建它的ModelView中可见。
        /// \param isVisibleOnlyInOwnerModelView 是否可见。
        /// \return void
        virtual void SetIsVisibleOnlyInOwnerModelView(bool isVisibleOnlyInOwnerModelView) = 0;

        /// \brief 获取项目端是否使用截面线样式
        ///
        /// \return 项目端使用截面线样式，返回true；否则返回false
        virtual bool GetUseSectionStyle() const = 0;

        /// \brief 设置项目端是否使用截面线样式
        /// \param bUseSectionStyle 项目端是否使用截面线样式
        virtual void SetUseSectionStyle(bool bUseSectionStyle) = 0;

        /// \brief 获取二维线是否只在构件剖切到时可见。
        /// 
        /// \return 如果二维线只在构件剖切到时可见返回true；否则返回false。
        virtual bool IsVisibleOnlyWhenGRepIsCropped() const = 0;
        /// \brief 设置二维线是否只在构件剖切到时可见。
        /// 
        /// \param isVisibleOnlyWhenGRepIsCropped 是否只在构件剖切到时可见
        /// \return void
        virtual void SetVisibleOnlyWhenGRepIsCropped(bool isVisibleOnlyWhenGRepIsCropped)  = 0;

        /// \brief 获取倒角斜线Id
        ///
        /// \return 倒角斜线Id
        virtual gcmp::ElementId GetChamferPointId() const = 0;

        /// \brief  设置倒角斜线Id
        ///
        /// \param  chamferPointId 倒角斜线Id
        virtual void SetChamferPointId(const gcmp::ElementId& chamferPointId) = 0;

        /// \brief 获得主对象（二维线）Id
        /// 主对象指具有强依赖关系的对象，当主对象被删除时，从对象也会被删除。
        ///
        /// \return ElementId 主对象（二维线）的Id
        virtual gcmp::ElementId GetMasterCurveId() const = 0;

        /// \brief 设置主对象（二维线）Id
        /// 主对象指具有强依赖关系的对象，当主对象被删除时，从对象也会被删除。
        ///
        /// \param masterId 主对象（二维线）Id
        /// \return void
        virtual void SetMasterCurveId(gcmp::ElementId masterCurveId) = 0;

    public:
        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();

        /// \brief 获取可见性标记
        /// 
        /// \return 标记值
        GCMP_OBSOLETE_API(2020/09/01, IDrawingLine::GetVisibilityTypeFlagsInHostDocument() const) virtual UInt32 GetVisibilityFlag() const = 0;

        /// \brief 设置可见性标记
        /// 
        /// \param flag 标记值
        GCMP_DEPRECATED_API(2020 / 09 / 01) virtual bool SetVisibilityFlag(UInt32 flag) = 0;
    };
}



